/*
 * Copyright (C) 2004-2005, Universidade Federal de Campina Grande. All rights reserved.
 */
package org.epanetgrid.otimizacao.ag;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.epanetgrid.otimizacao.log.AGLogger;
import org.epanetgrid.otimizacao.util.OtimizacaoUtil;
import org.jheuristics.DefaultIndividual;
import org.jheuristics.Individual;
import org.jheuristics.ga.GAConfig;
import org.jheuristics.ga.IndividualsFactory;
import org.jheuristics.util.BitString;


/**
 * O uso da regra de avalia��o � opcional.
 *
 * @author Marcell Manfrin, marcell@ourgrid.org, Nov 29, 2005
 */
public class SPIndividualsFactory implements IndividualsFactory, Serializable {
	private int numeroDeBombas;
	private int numeroDeIntervalos;
	
	private AGLogger logger = AGLogger.getInstance();

	/**
	 *
	 * @param bombas N�mero de bombas total
	 * @param intervalos N�mero de intervalos do gen
	 */
	public SPIndividualsFactory(int bombas, int intervalos) {
		if (0 >= bombas) {
			throw new IllegalArgumentException("N�mero de bombas tem que ser maior que zero");
		}
		if (0 >= intervalos) {
			throw new IllegalArgumentException("Quantidade de intervalos tem que ser maior que zero ");
		}
		numeroDeBombas = bombas;
		numeroDeIntervalos = intervalos;
	}

	/**
	 * Cria um indiv�duo randomico
	 * @param config Configura��o atual do AG
	 * @return Indiv�duo Rand�mico gerado
	 * @see org.jheuristics.ga.IndividualsFactory#createRandomIndividual(org.jheuristics.ga.GAConfig)
	 */
	public Individual createRandomIndividual(GAConfig config) {
		List<BitString> genes = new ArrayList<BitString>(numeroDeIntervalos);
		for (int j = 0; j < numeroDeIntervalos; j++) {
			genes.add(new BitString(numeroDeBombas, config.getRandomGenerator()));
		}
		StringBuffer buf = new StringBuffer("Novo cromossomo randômico:");
		buf.append(OtimizacaoUtil.gensToString(genes));
		logger.debug(buf);
		return new DefaultIndividual(genes);
	}

	/**
	 * Cria um indiv�duo espec�fico
	 *
	 * @param gens genes do indiv�duo
	 * @param config Configura��o atual do AG
	 * @return Novo indiv�duo
	 * @see org.jheuristics.ga.IndividualsFactory#createSpecificIndividual(java.lang.Object, org.jheuristics.ga.GAConfig)
	 */
	public Individual createSpecificIndividual(Object gens, GAConfig config) {
		return new DefaultIndividual(gens);
	}

}
